package com.klm.easymq.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 幂等控制注解
 * 用于标记需要幂等控制的方法
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
    
    /**
     * 幂等键表达式（SpEL）
     * 默认使用消息的id字段
     */
    String key() default "#message.id";
    
    /**
     * 幂等有效期（秒）
     * 默认3600秒（1小时）
     */
    int expireSeconds() default 3600;
    
    /**
     * 幂等失败时的处理策略
     */
    Strategy strategy() default Strategy.THROW_EXCEPTION;
    
    /**
     * 幂等失败时的错误消息
     */
    String errorMessage() default "消息已处理，请勿重复提交";
    
    /**
     * 幂等失败处理策略
     */
    enum Strategy {
        /**
         * 抛出异常
         */
        THROW_EXCEPTION,
        
        /**
         * 静默忽略
         */
        SILENT_IGNORE,
        
        /**
         * 返回默认值
         */
        RETURN_DEFAULT
    }
} 